var p = {
    c: function () {
        console.log('c');
    }
};

function Person () {
}

Person.prototype.a = function () {
    console.log("a");
};

// Person.prototype.__proto__ = p;

Person.prototype.__proto__.b = function () {
    console.log("b");
};

Person.prototype.__proto__ = p;

var person = new Person();
person.d = function () {
    console.log('d');
};
try{
    person.a(); // 自对象方法 a
    person.b(); // 继承对象方法 b
    person.c(); // 继承对象方法 c
}catch (e){
    console.log(e.message);
}

console.log(person.__proto__ === Person.prototype);//true
console.log(person.constructor === Person.prototype.constructor);//true

console.log(person.__proto__);//Person { a: [Function] }
console.log(person.__proto__.__proto__);//{ c: [Function: c]}
console.log(person.__proto__.__proto__.__proto__);//{ b: [Function] }
console.log(person.hasOwnProperty("a")); //false 是否包括自有属性
console.log(person.hasOwnProperty("b")); //false 是否包括自有属性
console.log(person.hasOwnProperty("c")); //false 是否包括自有属性
console.log(person.hasOwnProperty("d")); //true 是否包括自有属性

console.log(Person.hasOwnProperty("a")); //false 是否包括自有属性
console.log(Person.hasOwnProperty("b")); //false 是否包括自有属性
console.log(Person.hasOwnProperty("c")); //false 是否包括自有属性
console.log(Person.hasOwnProperty("d")); //false 是否包括自有属性

console.log(Person.prototype.hasOwnProperty("a")); //true 是否包括自有属性
console.log(Person.prototype.hasOwnProperty("b")); //false 是否包括自有属性
console.log(Person.prototype.hasOwnProperty("c")); //false 是否包括自有属性
console.log(Person.prototype.hasOwnProperty("d")); //false 是否包括自有属性

console.log(Person.prototype.__proto__.hasOwnProperty("a")); //false 是否包括自有属性
console.log(Person.prototype.__proto__.hasOwnProperty("b")); //false 是否包括自有属性
console.log(Person.prototype.__proto__.hasOwnProperty("c")); //true 是否包括自有属性

//Person.prototype.__proto__在Person.prototype.__proto__.b之后赋值，就有这种奇怪的现场，把b又给了上一级
console.log(Person.prototype.__proto__.__proto__.hasOwnProperty("b")); //true 是否包括自有属性

// console.log(person.__proto__.__proto__ === Function.prototype.__proto__);
